package com.model;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import com.common.BaseModel;
import com.model.composite.Contacto;
import com.model.composite.Direccion;

@SuppressWarnings("serial")
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Proveedor extends BaseModel {

	@Id
	@SequenceGenerator(name = "id", sequenceName = "ProveedorSEQ")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
	@Column(unique = true)
	private Long id;

	@Column(length = 200, nullable = false)
	private String nombre;

	@Column(length = 200, nullable = true)
	private String nombreFantasia;

	@Column(length = 200, nullable = true)
	private String observaciones;

	@ElementCollection(fetch = FetchType.EAGER)
	@CollectionTable(name = "Contactos_Proveedor", joinColumns = @JoinColumn(name = "PROVEEDOR_ID"))
	@Fetch(value = FetchMode.SUBSELECT)
	private List<Contacto> listaContactos;

	@Embedded
	private Direccion direccion;

	@Column(length = 30, nullable = true)
	private String dni;

	@Column(length = 30, nullable = true)
	private String cuil;

	@Column(length = 30, nullable = true)
	private String cuit;

	@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="proveedor")
	private List<ProductoCodigo> listaProductoCodigo;

	@Column(nullable = true)
	private String tipoProveedor;
	
	public Proveedor() {
		this(null, null, null, null, null, null, null, null, null, null, null);
	}

	public Proveedor(Long id, String nombre, String nombreFantasia,
			String observaciones, List<Contacto> listaContactos,
			Direccion direccion, String dni, String cuil, String cuit,
			List<ProductoCodigo> listaProductoCodigo, String tipoProveedor) {
		super();
		this.id = id;
		this.nombre = nombre;
		this.nombreFantasia = nombreFantasia;
		this.observaciones = observaciones;
		this.listaContactos = listaContactos;
		this.direccion = direccion;
		this.dni = dni;
		this.cuil = cuil;
		this.cuit = cuit;
		this.listaProductoCodigo = listaProductoCodigo;
		this.tipoProveedor = tipoProveedor;
	}

	@Override
	public Long getID() {
		return id;
	}

	@Override
	public void setID(Long id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getNombreFantasia() {
		return nombreFantasia;
	}

	public void setNombreFantasia(String nombreFantasia) {
		this.nombreFantasia = nombreFantasia;
	}

	public String getObservaciones() {
		return observaciones;
	}

	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}

	public List<Contacto> getListaContactos() {
		return listaContactos;
	}

	public void setListaContactos(List<Contacto> listaContactos) {
		this.listaContactos = listaContactos;
	}

	public Direccion getDireccion() {
		return direccion;
	}

	public void setDireccion(Direccion direccion) {
		this.direccion = direccion;
	}

	public String getDni() {
		return dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	public String getCuil() {
		return cuil;
	}

	public void setCuil(String cuil) {
		this.cuil = cuil;
	}

	public String getCuit() {
		return cuit;
	}

	public void setCuit(String cuit) {
		this.cuit = cuit;
	}

	public List<ProductoCodigo> getListaProductoCodigo() {
		return listaProductoCodigo;
	}

	public void setListaProductoCodigo(List<ProductoCodigo> listaProductoCodigo) {
		this.listaProductoCodigo = listaProductoCodigo;
	}

	public String getTipoProveedor() {
		return tipoProveedor;
	}

	public void setTipoProveedor(String tipoProveedor) {
		this.tipoProveedor = tipoProveedor;
	}



}
